package com.ruoyi.system.mapper;

import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.system.domain.BizBarcode;

/**
 * 箱码列表Mapper接口
 * 
 * @author ruoyi
 * @date 2025-10-21
 */
public interface BizBarcodeMapper 
{
    /**
     * 查询箱码列表
     * 
     * @param barcodeId 箱码列表主键
     * @return 箱码列表
     */
    public BizBarcode selectBizBarcodeByBarcodeId(Long barcodeId);

    /**
     * 查询箱码列表列表
     * 
     * @param bizBarcode 箱码列表
     * @return 箱码列表集合
     */
    public List<BizBarcode> selectBizBarcodeList(BizBarcode bizBarcode);

    /**
     * 新增箱码列表
     * 
     * @param bizBarcode 箱码列表
     * @return 结果
     */
    public int insertBizBarcode(BizBarcode bizBarcode);

    /**
     * 修改箱码列表
     * 
     * @param bizBarcode 箱码列表
     * @return 结果
     */
    public int updateBizBarcode(BizBarcode bizBarcode);

    /**
     * 删除箱码列表
     * 
     * @param barcodeId 箱码列表主键
     * @return 结果
     */
    public int deleteBizBarcodeByBarcodeId(Long barcodeId);

    /**
     * 批量删除箱码列表
     * 
     * @param barcodeIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteBizBarcodeByBarcodeIds(Long[] barcodeIds);

    // 获取指定日期前缀的最大批次号（如 20241215xxx）
    public String selectMaxBatchNoByDate(String prefix);

    // 获取指定日期前缀的最大箱码（如 BC20241215xxxxx）
    public String selectMaxBarcodeByPrefix(String prefix);

    // 批量更新箱码为已收状态，并写入收料单号与收料时间
    public int batchUpdateReceivedStatus(@Param("receiptNoteNo") String receiptNoteNo,
                                         @Param("receivedTime") java.util.Date receivedTime,
                                         @Param("barcodeIds") Long[] barcodeIds);

    // 汇总某采购明细的已收数量（按主条码中 item_id 与状态 RECEIVED 统计）
    public java.math.BigDecimal selectSumReceivedQuantityByItemId(Long itemId);

    /**
     * 批量更新箱码的检验计划号并设置状态为 INSPECTING
     * @param inspectionPlanNo 检验计划号
     * @param barcodeIds 箱码ID集合
     * @return 影响行数
     */
    public int batchUpdateInspectingStatus(@Param("inspectionPlanNo") String inspectionPlanNo,
                                           @Param("barcodeIds") Long[] barcodeIds);

    /**
     * 批量更新箱码为入库完成（PUTAWAY），并写入入库单号与入库时间
     * @param purchaseInNo 入库单号
     * @param putawayTime 入库时间
     * @param barcodeIds 箱码ID集合
     * @return 影响行数
     */
    public int batchUpdatePutawayStatus(@Param("purchaseInNo") String purchaseInNo,
                                        @Param("putawayTime") java.util.Date putawayTime,
                                         @Param("barcodeIds") Long[] barcodeIds);

    /**
     * 批量更新箱码为已送货关联（DELIVERED），不改写送货单号与送货时间
     * @param barcodeIds 箱码ID集合
     * @return 影响行数
     */
    public int batchUpdateDeliveryStatus(@Param("barcodeIds") Long[] barcodeIds);

    /**
     * 批量更新箱码为拒收（REJECTED），并写入检验计划号与检验时间
     * @param inspectionPlanNo 检验计划号
     * @param rejectedTime 拒收时间（作为检验完成时间）
     * @param barcodeIds 箱码ID集合
     * @return 影响行数
     */
    public int batchUpdateRejectedStatus(@Param("inspectionPlanNo") String inspectionPlanNo,
                                         @Param("rejectedTime") java.util.Date rejectedTime,
                                         @Param("barcodeIds") Long[] barcodeIds);
}
